package com.atguigu.gulimall.basic.minio.service;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;
import com.atguigu.gulimall.basic.minio.config.MinioProperties;
import com.atguigu.gulimall.basic.minio.utils.MinioUtil;
import io.minio.messages.Bucket;
import lombok.RequiredArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


/**
 * <p>
 *
 * </p>
 *
 * @author : yhd
 * @since : 2023-05-26 10:50
 */
@RequiredArgsConstructor
public class MinioService {

    private final MinioUtil minioUtil;
    private final MinioProperties minioProperties;


    public boolean bucketExists(String bucketName) {
        return minioUtil.bucketExists(bucketName);
    }


    public void makeBucket(String bucketName) {
        minioUtil.makeBucket(bucketName);
    }

    /**
     * 列出所有存储桶名称
     *
     * @return 所有存储桶名称
     */
    public List<String> listBucketName() {
        return minioUtil.listBucketNames();
    }

    /**
     * 列出所有存储桶
     *
     * @return 所有存储桶
     */
    public List<Bucket> listBuckets() {
        return minioUtil.listBuckets();
    }

    public boolean removeBucket(String bucketName) {
        return minioUtil.removeBucket(bucketName);
    }

    public List<String> listObjectNames(String bucketName) {
        return minioUtil.listObjectNames(bucketName);
    }


    public Map<String, String> putObject(MultipartFile file, String bucketName, String fileType) {
        Map<String, String> returnMap = new HashMap<>(2);
        try {
            bucketName = StrUtil.isNotEmpty(bucketName) && !"null".equals(bucketName) ? bucketName : minioProperties.getBucketName();
            if (!this.bucketExists(bucketName)) {
                this.makeBucket(bucketName);
            }
            String fileName = file.getOriginalFilename();

            String objectName = UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
            minioUtil.putObject(bucketName, file, objectName, fileType);
            String fileUrl = minioProperties.getEndpoint() + StrPool.COLON + minioProperties.getPort() + "/" + bucketName + "/" + objectName;
            returnMap.put("fileName", fileName);
            returnMap.put("fileUrl", fileUrl);
            returnMap.put("createTime", DateTime.now().toString());
        } catch (Exception e) {
            e.printStackTrace();
            returnMap.put("error", "上传失败-" + e.getMessage());
        }
        return returnMap;

    }

    /**
     * 以流的形式获取一个文件对象
     *
     * @param bucketName 存储桶名称
     * @param objectName 存储桶里的对象名称
     * @return 文件流
     */
    public InputStream downloadObject(String bucketName, String objectName) {
        return minioUtil.getObject(bucketName, objectName);
    }

    /**
     * 删除一个对象
     *
     * @param bucketName 存储桶名称
     * @param objectName 存储桶里的对象名称
     */
    public boolean removeObject(String bucketName, String objectName) {
        return minioUtil.removeObject(bucketName, objectName);
    }

    /**
     * 删除指定桶的多个文件对象,返回删除错误的对象列表，全部删除成功，返回空列表
     *
     * @param bucketName  存储桶名称
     * @param objectNameList 含有要删除的多个object名称的迭代器对象
     * @return 删除结果
     */
    public boolean removeListObject(String bucketName, List<String> objectNameList) {
        return minioUtil.removeObject(bucketName, objectNameList);
    }

    /**
     * 文件访问路径
     *
     * @param bucketName 存储桶名称
     * @param objectName 存储桶里的对象名称
     * @return 文件访问路径
     */
    public Map<String, String> getObjectUrl(String bucketName, String objectName) {
        Map<String, String> returnMap = new HashMap<>(2);
        returnMap.put("createTime", DateTime.now().toString());
        String fileUrl = minioUtil.getObjectUrl(bucketName, objectName);
        if (StrUtil.isNotEmpty(fileUrl)) {
            returnMap.put("fileUrl", fileUrl);
        } else {
            returnMap.put("error", "请求失败");
        }
        return returnMap;
    }


    /**
     * 通过InputStream上传对象
     *
     * @param bucketName  存储桶名称
     * @param objectName  存储桶里的对象名称
     * @param inputStream 要上传的流
     * @param contentType 要上传的文件类型 MimeTypeUtils.IMAGE_JPEG_VALUE
     * @return 上传结果
     */
    public boolean putObject(String bucketName, String objectName, InputStream inputStream, String contentType) {
        return minioUtil.putObject(bucketName, objectName, inputStream, contentType);
    }

}
